package cn.itcast.demo.lucene;

import org.apache.commons.io.FileUtils;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.*;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.Test;
import org.wltea.analyzer.lucene.IKAnalyzer;

import java.io.File;
import java.io.IOException;

public class CreateIndex {


    /**
     * 创建索引
     *  索引库数据来源：
     *      1、数据库数据
     *      2、互联网资源数据
     *      3、本地文件资源
     */
    @Test
    public void createIndexTest() throws IOException {
        System.out.println("第一次编辑。。。。。");
        System.out.println("第三次编辑。。。。。1233");
        System.out.println("第er次编辑。。。。。");
        System.out.println("在dev开发代码");


        //准备索引库目录位置
        FSDirectory directory = FSDirectory.open(new File("F:\\index89"));
        //分词器，需要对文档内容分词  Lucene默认分词器
        //Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_4_10_3);
        //分词器  没两个字组一个词
        //Analyzer analyzer = new CJKAnalyzer(Version.LUCENE_4_10_3);
        //使用ik分词器分词
        Analyzer analyzer = new IKAnalyzer();

        //索引库写对象的配置信息
        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_3,analyzer);
        //1、创建写入索引库对象
        IndexWriter indexWriter = new IndexWriter(directory,config);

        //准备索引库数据源  获取数据源目录
        File fileDir = new File("F:\\searchsource");
        //获取文件数组
        File[] files = fileDir.listFiles();

        for (File file : files) {
            //创建文档对象
            Document document = new Document();
            //设置文档对象域字段内容
            //参数一：字段名称 参数二：字段内容 参数三：是否存储
            //TextField 字段默认分词
            document.add(new TextField("fileName",file.getName(), Field.Store.YES));
            document.add(new TextField("fileContent", FileUtils.readFileToString(file), Field.Store.YES));
            document.add(new LongField("fileSize", FileUtils.sizeOf(file), Field.Store.YES));
            //StringField域字段类型，默认是不分词存储
            document.add(new StringField("filePath", file.getPath(), Field.Store.YES));
            //索引库添加文档
            indexWriter.addDocument(document);
        }

        //更新文档数据  更新逻辑：先将满足更新条件的文档删除，在新增参数二赋予的文档对象
        //indexWriter.updateDocument(new Term(),document);

        //提交操作文档数据
        indexWriter.commit();
        //释放资源
        indexWriter.close();

    }

    /**
     * 删除索引数据
     */
    @Test
    public void delelteIndexTest() throws IOException {
        //准备索引库目录位置
        FSDirectory directory = FSDirectory.open(new File("F:\\index89"));
        //分词器，需要对文档内容分词  Lucene默认分词器
        //Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_4_10_3);
        //分词器  没两个字组一个词
        //Analyzer analyzer = new CJKAnalyzer(Version.LUCENE_4_10_3);
        //使用ik分词器分词
        Analyzer analyzer = new IKAnalyzer();

        //索引库写对象的配置信息
        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_3,analyzer);
        //1、创建写入索引库对象
        IndexWriter indexWriter = new IndexWriter(directory,config);

        //删除索引库文档对象  慎用
        //删除所有文档
        //indexWriter.deleteAll();
        //基于词条删除
        //indexWriter.deleteDocuments(new Term("fileName","传智播客"));
        //基于查询删除
        NumericRangeQuery<Long> query = NumericRangeQuery.newLongRange("fileSize", 0L, 50L, true, true);
        indexWriter.deleteDocuments(query);
        //提交操作文档数据
        indexWriter.commit();
        //释放资源
        indexWriter.close();

    }
}
